package cn.shop.utils;

import java.util.HashMap;
import java.util.Map;

/**
 * @author : 李一涵
 * @date : Created in 2021-10-29 9:27
 * @description : api返回结果工具
 */
@SuppressWarnings("unused")
public class ApiResult<T> {

	private ApiCode code;

	private String message;

	private T data;

	public ApiResult(ApiCode code, String message, T data) {
		this.code = code;
		this.message = message;
		this.data = data;
	}

	public ApiCode getCode() {
		return code;
	}

	public void setCode(ApiCode code) {
		this.code = code;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	public T getData() {
		return data;
	}

	public void setData(T data) {
		this.data = data;
	}

	public static ApiResult<Map<String, Object>> result(boolean success) {
		return success ? success() : fail();
	}

	public static ApiResult<Map<String, Object>> result(boolean success, String msg) {
		return success ? success() : fail(msg);
	}

	/**
	 * 返回默认失败结果 代码详见 ${@link ApiCode}
	 *
	 * @return 拼装好的失败结果
	 */
	public static ApiResult<Map<String, Object>> fail() {
		return new ApiResult<>(ApiCode.FAIL, ApiCode.FAIL.description(), defaultData());
	}

	/**
	 * 返回默认失败结果 代码详见 ${@link ApiCode}
	 *
	 * @param message 错误信息
	 * @return 拼装好的失败结果
	 */
	public static ApiResult<Map<String, Object>> fail(String message) {
		return new ApiResult<>(ApiCode.FAIL, message, defaultData());
	}

	/**
	 * 返回指定代码的失败结果
	 *
	 * @param code 代码
	 * @return 拼装好的失败结果
	 */
	public static ApiResult<Map<String, Object>> fail(ApiCode code, String message) {
		return new ApiResult<>(code, message, defaultData());
	}

	/**
	 * 返回指定代码的失败结果
	 *
	 * @param code 代码
	 * @return 拼装好的失败结果
	 */
	public static ApiResult<Map<String, Object>> fail(ApiCode code) {
		return new ApiResult<>(code, code.description(), defaultData());
	}

	/**
	 * 返回带数据的默认失败结果
	 *
	 * @param t 要返回的数据
	 * @return 拼装好的失败结果
	 */
	public static <T> ApiResult<T> fail(String message, T t) {
		return new ApiResult<>(ApiCode.FAIL, message, t);
	}

	/**
	 * 返回指定代码的带数据的失败结果
	 *
	 * @param code 代码
	 * @param t    要返回的结果
	 * @return 拼装好的失败结果
	 */
	public static <T> ApiResult<T> fail(ApiCode code, String message, T t) {
		return new ApiResult<>(code, message, t);
	}

	/**
	 * 返回默认的成功结果 代码详见 ${@link ApiCode}
	 *
	 * @return 拼装好的成功结果
	 */
	public static ApiResult<Map<String, Object>> success() {
		return new ApiResult<>(ApiCode.SUCCESS, ApiCode.SUCCESS.description(), defaultData());
	}

	/**
	 * 返回默认的成功结果 代码详见 ${@link ApiCode}
	 *
	 * @return 拼装好的成功结果
	 */
	public static ApiResult<Map<String, Object>> success(String message) {
		return new ApiResult<>(ApiCode.SUCCESS, message, defaultData());
	}

	/**
	 * 返回带数据的成功结果
	 *
	 * @param t 要返回的数据
	 * @return 拼装好的成功结果
	 */
	public static <T> ApiResult<T> success(T t) {
		return new ApiResult<>(ApiCode.SUCCESS, "", t);
	}

	/**
	 * 返回带数据和自定义信息的成功结果
	 *
	 * @param message 返回的信息
	 * @param t       返回的数据
	 */
	public static <T> ApiResult<T> success(String message, T t) {
		return new ApiResult<>(ApiCode.SUCCESS, message, t);
	}

	/**
	 * 返回指定代码带数据的成功结果
	 *
	 * @param code 代码
	 * @param t    要返回的数据
	 * @return 拼装好的成功结果
	 */
	public static <T> ApiResult<T> success(ApiCode code, T t) {
		return new ApiResult<>(code, "", t);
	}

	private static Map<String, Object> defaultData() {
		return new HashMap<>(1);
	}


	@Override
	public String toString() {
		return "ApiResult{" +
				"code=" + code +
				", message='" + message + '\'' +
				", data=" + data +
				'}';
	}

}
